static int talk_to_backend(struct xenbus_device *, struct netfront_info *);
static int setup_device(struct xenbus_device *, struct netfront_info *);
-static int create_netdev(int, struct xenbus_device *, struct net_device **);
+static struct net_device *create_netdev(int, struct xenbus_device *);
static void netfront_closing(struct xenbus_device *);
static irqreturn_t netif_int(int irq, void *dev_id, struct pt_regs *ptregs);
+#ifdef CONFIG_SYSFS
+static int xennet_sysfs_addif(struct net_device *netdev);
+static void xennet_sysfs_delif(struct net_device *netdev);
+#else /* !CONFIG_SYSFS */
+#define xennet_sysfs_addif(dev) (0)
+#define xennet_sysfs_delif(dev) do { } while(0)
+#endif
/**
* Entry point to this code when a new device is created. Allocate the basic
return err;
}
- err = create_netdev(handle, dev, &netdev);
- if (err) {
+ netdev = create_netdev(handle, dev);
+ if (IS_ERR(netdev)) {
+ err = PTR_ERR(netdev);
xenbus_dev_fatal(dev, err, "creating netdev");
return err;
}
err = talk_to_backend(dev, info);
if (err) {
+ xennet_sysfs_delif(info->netdev);
unregister_netdev(netdev);
free_netdev(netdev);
dev->data = NULL;
}
}
-#else /* !CONFIG_SYSFS */
-
-#define xennet_sysfs_addif(dev) (0)
-#define xennet_sysfs_delif(dev) do { } while(0)
-
-#endif
+#endif /* CONFIG_SYSFS */
/*
* @param val return parameter for created device
* @return 0 on success, error code otherwise
*/
-static int __devinit create_netdev(int handle, struct xenbus_device *dev,
- struct net_device **val)
+static struct net_device * __devinit create_netdev(int handle,
+ struct xenbus_device *dev)
{
int i, err = 0;
struct net_device *netdev = NULL;
if (!netdev) {
printk(KERN_WARNING "%s> alloc_etherdev failed.\n",
__FUNCTION__);
- return -ENOMEM;
+ return ERR_PTR(-ENOMEM);
}
np = netdev_priv(netdev);
}
np->netdev = netdev;
- if (val)
- *val = netdev;
- return 0;
+ return netdev;
exit_free_rx:
gnttab_free_grant_references(np->gref_tx_head);
exit:
free_netdev(netdev);
- return err;
+ return ERR_PTR(err);
}
/*